import os, sys
from datetime import datetime
import json
from openai import OpenAI
from dotenv import load_dotenv
from langchain_deepseek import ChatDeepSeek
from mcp.server.fastmcp import FastMCP
import random
from datetime import datetime

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../')))
from insight_agent.utils.http_post import get_insight_request, inform_insight_thinking, update_insight_result

load_dotenv()

# 初始化 MCP 服务器
mcp = FastMCP("QPServer")
USER_AGENT = "QP-app/1.0"
# 文件保存目录
OUTPUT_DIR = "./output"

def get_current_time():
    # 获取当前日期和时间
    current_datetime = datetime.now()
    # 格式化当前日期和时间
    formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S')
    # 返回格式化后的当前时间
    return f"当前时间：{formatted_time}。"

def deepseek_response(query: str):
    client = OpenAI(api_key=os.getenv("ALIYUN_KEY"), base_url=os.getenv("ALI_BASE_URL"))

    response = client.chat.completions.create(
        model=os.getenv("ALIYUN_MODEL"),
        messages=[
            {"role": "system", "content": "You are a helpful assistant"},
            {"role": "user", "content": query},
        ],
        stream=False
    )
    return response.choices[0].message.content

@mcp.tool()
async def query_processing(query: str):
    """
    帮我分析20250717-20250730北京市每日总家宽条数的变化，并画图展示结果

    处理用户的问题意图，并且从中获取问题中的关键参数，为后置的sql取数据做准备
    输入:
    query 字符串类型 内容为用户关于时序模式的相关问题

    输出: 内容为问题的关键参数,json格式
    user_scope 字符串类型 内容为用户范围
    start_time 字符串类型 内容为开始时间 请以YYYYMMDD的形式返回
    end_time 字符串类型 内容为结束时间 请以YYYYMMDD的形式返回
    index 字符串类型 内容为指标名称

    样例:
    输入: 请帮我查询近1个月的家宽用户数量
    query: 请帮我查询近1个月的家宽用户数量
    user_scope: 所有家宽用户
    start_time: 20250725
    end_time: 20250825
    index: 用户数量

    需要重点注意的细节:
    请注意如果start_time和end_time都没有显式指定，那么end_time为大模型的当前时间，请根据用户query推理出start_time，如果无法推理出start_time，那么设定start_time为end_time前30天
    """
    inform_insight_thinking("agent_time_series", f'tools - query_processing')
    current_time = get_current_time()

    background_template = """
    query 字符串类型 内容为用户关于时序模式的相关问题

    输出: 内容为问题的关键参数,json格式
    user_scope 字符串类型 内容为用户范围
    start_time 字符串类型 内容为开始时间 请以YYYYMMDD的形式返回
    end_time 字符串类型 内容为结束时间 请以YYYYMMDD的形式返回
    index 字符串类型 内容为指标名称

    样例:
    输入: 请帮我查询近1个月的家宽用户数量
    query: 请帮我查询近1个月的家宽用户数量
    user_scope: 所有家宽用户
    start_time: 20250725
    end_time: 20250825
    index: 用户数量

    需要重点注意的细节:
    1. 请注意如果start_time和end_time都没有显式指定，那么end_time为大模型的当前时间，请根据用户query推理出start_time，如果无法推理出start_time，那么设定start_time为end_time前30天
    2. 如果用户显式指定当前时间，例如用户说“设定现在的时间是YYYYMMDD”，那么则根据语义设定start_time或end_time为YYYYMMDD
    3. 第2点举例，例如用户指定“假设现在的时间是20250314，请帮我分析北京当前时间40天后的家宽用户数量情况”，则start_time为20250314
    4. 第2点举例，例如用户指定“设定现在的时间是20250714，请帮我分析北京家宽用户近一个月的家宽流量使用情况”，则end_time为202050714
    5. 请确保start_time在end_time之前，并且都不为空
    """

    time_correction_template = f"当前的用户query是{query}，当前的背景是{background_template}，当前时间是{current_time}, 请根据query提取关键参数，并根据返回结构中的问题本身和开始时间结束时间，来决定开始时间结束时间是否要校正，请注意，如果用户没有特别指定时间，那么则更改结束时间为当前时间，相应的开始时间也要更改，结果以同样格式的json返回，注意只返回json，不要有其他任何东西"

    response = deepseek_response(time_correction_template)
    return response

    # return query, user_scope, start_time, end_time, index


# async def main():
#     # Test the async function
#     result = await query_processing("请帮我分析1993-06-20-19940202的家宽用户流量情况")
#     print(result)


if __name__ == "__main__":
    # # Run the async main function
    # asyncio.run(main())

    # 以标准 I/O 方式运行 MCP 服务器
    mcp.run(transport='stdio')